import pandas as  pd

# 从本地引入泰坦尼克号数据
titanic = pd.read_csv('PythonMachineLearningAndPractice/data/section02/05Titanic/titanic.txt')

# 人工选取pclass、age以及sex作为判别乘客是否能够生还的特征
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']


# 对于数据缺失的年龄信息，我们使用全体乘客的平均年龄代替，这样可以保证顺利训练 模型的同时，尽可能不影响预测任务
X['age'].fillna(X['age'].mean(), inplace=True)


from sklearn.cross_validation import train_test_split
# 对原始数据进行分割，25%的乘客数据用于测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
# print(X_train)


# 对类别型特征进行转换，称为特征向量
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
X_test = vec.transform(X_test.to_dict(orient='record'))


# 使用单一决策树进行模型训练以及预测分析
from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier()
dtc.fit(X_train, y_train)
dtc_y_predict = dtc.predict(X_test)
# print(dtc_y_predict)


# 使用随机森林分类器进行集成模型的训练以及预测分析
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc_y_predict = rfc.predict(X_test)
# print(rfc_y_predict)


# 使用梯度提升决策树进行集成模型的训练以及预测分析
from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier()
gbc.fit(X_train, y_train)
gbc_y_predict = gbc.predict(X_test)
# print(gbc_y_predict)

# 从sklearn.metrics导入classification_report
from sklearn.metrics import classification_report

# 输出单一决策树在测试集上的分类准确性，以及更加详细的准确率、召回率、F1指标
print('单一决策树的准确率', dtc.score(X_test, y_test))
print(classification_report(dtc_y_predict, y_test))

# 输出随机森林分类器在测试集上的分类准确性，以及更加详细的准确率、召回率、F1指标
print('随机森林分类的准确率',rfc.score(X_test, y_test))
print(classification_report(rfc_y_predict, y_test))

# 输出梯度提升决策树的测试集上的分类准确性，以及更加详细的准确率、召回率、F1指标
print('梯度提升决策树的准确率',gbc.score(X_test, y_test))
print(classification_report(gbc_y_predict, y_test))